package ar.com.uade.administradorsiembra.controladores;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ar.com.uade.administradorsiembra.modelo.Cereal;
import ar.com.uade.administradorsiembra.modelo.CerealFino;
import ar.com.uade.administradorsiembra.modelo.CerealGrueso;
import ar.com.uade.administradorsiembra.modelo.Mineral;
import ar.com.uade.administradorsiembra.modelo.exceptions.CerealInexistente;
import ar.com.uade.administradorsiembra.modelo.exceptions.CerealYaExisteException;
import ar.com.uade.administradorsiembra.persistencia.CerealMapper;
import ar.com.uade.administradorsiembra.persistencia.MineralMapper;
import ar.com.uade.administradorsiembra.views.CerealView;
import ar.com.uade.administradorsiembra.views.MineralView;

public class ABMCerealController {
	private static ABMCerealController controller;
	private CerealMapper cerealMapper;
	private MineralMapper mineralMapper;
	
	private ABMCerealController() {
	}
	
	private CerealMapper getCerealMapper(){
		if(cerealMapper == null){
			cerealMapper = new CerealMapper();
		}
		
		return cerealMapper;
	}
	
	private MineralMapper getMineralMapper(){
		if(mineralMapper == null){
			mineralMapper = new MineralMapper();
		}
		
		return mineralMapper;
	}
	
	public static ABMCerealController getInstancia() {
		if(controller == null) {
			controller = new ABMCerealController();
		}
		
		return controller;
	}
	
	public void crearCerealFino(Integer codigo, String descripcion,
			Date fechaDesde, Date fechaHasta, Float rendimiento,
			Integer codMineral) throws CerealYaExisteException {

		Cereal cerealFino = getCerealMapper().buscarPorCodigo(codigo);
		
		if (cerealFino == null) {
			cerealFino = new CerealFino(codigo, descripcion, fechaDesde,
					fechaHasta, rendimiento,
					getMineralMapper().buscarPorCodigo(codMineral), false);
			if (cerealFino != null) {
				getCerealMapper().guardar(cerealFino);
			}
		} else {
			throw new CerealYaExisteException();
		}
	}

	public void crearCerealGrueso(Integer codigo, String descripcion,
			Date fechaDesde, Date fechaHasta, Float rendimiento,
			Integer codMineral, Float porcDesperdicio)
			throws CerealYaExisteException {
		
		Cereal cerealGrueso = getCerealMapper().buscarPorCodigo(codigo);
		
		if (cerealGrueso == null) {
			cerealGrueso = new CerealGrueso(codigo, descripcion, fechaDesde,
					fechaHasta, rendimiento,
					getMineralMapper().buscarPorCodigo(codMineral), false,
					porcDesperdicio / 100);

			if (cerealGrueso != null) {
				getCerealMapper().guardar(cerealGrueso);
			}
		} else {
			throw new CerealYaExisteException();
		}
	}

	public void modificarCerealFino(Integer codigo, String descripcion,
			Date fechaDesde, Date fechaHasta, Float rendimiento,
			Integer codMineral, Integer tipoCereal) {

		CerealFino cerealFino = this.buscarCerealFino(codigo);
		cerealFino.modificarCerealFino(codigo, descripcion, fechaDesde,
				fechaHasta, rendimiento,
				getMineralMapper().buscarPorCodigo(codMineral), false, tipoCereal);

		getCerealMapper().modificar(cerealFino);
	}

	public void modificarCerealGrueso(Integer codigo, String descripcion,
			Date fechaDesde, Date fechaHasta, Float rendimiento,
			Integer codMineral, Integer tipoCereal, Float porcDesperdicio) {
		
		CerealGrueso cerealGrueso = this.buscarCerealGrueso(codigo);
		
		cerealGrueso.setDescripcion(descripcion);
		cerealGrueso.setFechaDesde(fechaDesde);
		cerealGrueso.setFechaHasta(fechaHasta);
		cerealGrueso.setRendimiento(rendimiento);
		cerealGrueso.setMineralPrincipal(getMineralMapper().buscarPorCodigo(codMineral));
		cerealGrueso.setEliminado(false);
		cerealGrueso.setTipoCereal(tipoCereal);
		cerealGrueso.setDesperdicio(porcDesperdicio);
		
		/*cerealGrueso.modificarCerealGrueso(codigo, descripcion, fechaDesde,
				fechaHasta, rendimiento,
				getMineralMapper().buscarPorCodigo(codMineral), false, tipoCereal,
				porcDesperdicio);*/

		getCerealMapper().modificar(cerealGrueso);
	}

	public void borrarCerealFino(Integer codCereal) throws CerealInexistente {
		borrarCereal(codCereal);
	}

	public void borrarCerealGrueso(Integer codCereal) throws CerealInexistente {
		borrarCereal(codCereal);
	}

	public List<MineralView> getMinerales() {
		List<Mineral> minerales = getMineralMapper().buscarTodos();
		List<MineralView> mineralesView = new ArrayList<MineralView>();
		
		for (Mineral mineral : minerales) {
			mineralesView.add(mineral.getView());
		}
		
		return mineralesView;
	}
	
	public List<CerealView> getCereales() {
		List<Cereal> cereales = this.getCerealMapper().buscarTodos();
		List<CerealView> cerealesView = new ArrayList<CerealView>();
		
		for (Cereal cereal : cereales) {
			cerealesView.add(cereal.getView());
		}
		
		return cerealesView;
	}
	
	private void borrarCereal(Integer codCereal) throws CerealInexistente {
		if (getCerealMapper().borrar(getCerealMapper().buscarPorCodigo(codCereal)) == false) {
			throw new CerealInexistente();
		}
	}

	private CerealFino buscarCerealFino(Integer codCereal) {
		return (CerealFino) getCerealMapper().buscarPorCodigo(codCereal);
	}

	private CerealGrueso buscarCerealGrueso(Integer codCereal) {
		return (CerealGrueso) getCerealMapper().buscarPorCodigo(codCereal);
	}
}
